SQL es un lenguaje de programación declarativa, ya que solo indicamos lo que queremos hacer, pero no de qué forma.
Ejemplo:
xxxxxxxxxx31SELECT *2FROM Cuenta3WHERE titular = 'Jesus';Tenemos dos opciones para realizar la consulta:
Full Scan de la tabla cuenta.
Índice sobre titular: Búsqueda en índice y después obtención de resultados de la tabla cuenta.
El procesamiento de consultas hace referencia a una serie de actividades implicadas en la extracción de datos de una base de datos. Estas actividades incluyen la traducción de consultas expresadas en lenguajes de bases de datos de alto nivel en expresiones implementadas en el nivel físico del sistema, así como transformaciones de optimización de consultas y la evaluación real de las mismas.

Cuando se realiza una consulta en un SGBD es necesario realizar una serie de pasos para obtener una consulta válida:
Análisis y traducción: El analizador de sentencias evalúa sintáctica y semánticamente la sentencia recibida.
El analizador es un validador léxico, sintáctico y semántico similar al de los compiladores de otros lenguajes. Informa de errores en caso de haberlos y, si no, transforma la sentencia en una o varias expresiones algebraicas denominadas primitivas de evaluación.
Optimización: El optimizador recibe las primitivas de evaluación, ejecuta una serie de optimizaciones y establece todos los posibles planes de ejecución. Un plan de ejecución es la suma de todas las operaciones que habrá que llevar a cabo para ejecutar la sentencia.
Una vez calculados todos los planes, estima el costo (CPU y tiempo) de cada uno y elige el más óptimo.
Evaluación: El motor recibe el plan de ejecución y lo ejecuta paso a paso, devolviendo todos los resultados en caso de haberlos.
Es responsabilidad del SGBD que los anteriores componentes funcionen correctamente y que seleccionen los planes de ejecución adecuados en base a los recursos de los que disponen.
Optimizar una consulta consiste en conseguir que el plan de ejecución elegido por el SGBD sea el plan de ejecución óptimo en tiempo y en uso de CPU.
Existen dos formas:
Optimizar el analizador de sentencias: Implica profundos conocimientos de álgebra relacional y conllevaría modificar el SGBD.
Ayudar al optimizador: Implica conocer cuántos datos hay almacenados, su frecuencia de acceso y su tipología. No conlleva modificaciones en el SGBD.
El optimizador estima el coste de cada plan en base a:
Información estadística de las relaciones (numero de tuplas, número de bloques, tamaño en bytes, …).
Tamaño de las relaciones.
Índices.
Accesos a disco.
Las optimizaciones primarias son las optimizaciones que realiza el optimizador de forma nativa y suelen realizarse cuando ejecutamos:
JOIN
ORDER BY
GROUP BY
Expresiones de este estilo:
xxxxxxxxxx11WHERE column1 = column2 AND column2 = 'x'Pasan a esto:
xxxxxxxxxx11WHERE column1 = 'x' AND column2 = 'x'
xxxxxxxxxx11WHERE (0 = 1 AND s1 = 5) OR s1 = 7Como 0 = 1 no es posible y es una conjunción con s1 = 5, esto siempre será falso, por lo tanto, podemos reducir la expresión al valor de la disyunción.
xxxxxxxxxx11WHERE s1 = 7
Driver expressionLas Driver expression son las acciones que nosotros realizamos para que el optimizador haga lo que nosotros queremos que haga.
Ejemplo: Supongamos que no tenemos ningún índice.
xxxxxxxxxx31SELECT *2FROM Cuenta3WHERE titular = 'Jesus' AND saldo <= 10000;En este caso, el peor plan de ejecución seria la realización de un full scan.
Lo que nosotros haríamos para mejorar esta consulta, sería crear un índice en titular para evitar el full scan y reducir el tiempo de ejecución de la consulta.
Por esto se llama driver expresion, porque nosotros, al crear el índice en titular, estamos "obligando" al SGBD a hacer uso de este índice para realizar la consulta.
Visualizar y comprender el plan de ejecución de una consulta: Qué hace y por qué.
Evaluar las decisiones críticas:
JOIN
ORDER BY
GROUP BY
Buscar errores comunes en la escritura de consultas.
Pensar si una consulta es la que quiero o debo hacer.